/*
 * ImagenesDAO.java
 *
 * Created on 26 de septiembre de 2006, 17:13
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.facturacion.noclass.dao;
import com.src.computec.facturacion.base.constantes.ConstantesGenerales;
import static com.src.computec.facturacion.base.constantes.ConstantesGenerales.SCHEMA;
import static com.src.computec.facturacion.base.constantes.ConstantesGenerales.CODIGO_DANE_VACIO;
import static com.src.computec.facturacion.base.constantes.ConstantesGenerales.CODIGO_TIPO_PROVEEDOR_MENSAJERIA;
import static com.src.computec.radar.services.base.constantes.ConstantesGenerales.NO_CLASS_ORIGINAL;
import static com.src.computec.radar.services.base.constantes.ConstantesGenerales.NO_CLASS_NO_GENERADO;
import static com.src.computec.radar.services.base.constantes.ConstantesGenerales.NO_CLASS_GENERADO;
import static com.src.computec.radar.services.base.constantes.ConstantesGenerales.NO_CLASS_RETENCION;
import static com.src.computec.facturacion.base.constantes.ConstantesGenerales.CODIGO_TIPO_PROVEEDOR_MENSAJERIA;
import com.src.computec.facturacion.noclass.dto.ClasificacionDetalladaDto;
import com.src.computec.facturacion.noclass.dto.ClasificacionDto;
import com.src.computec.facturacion.noclass.dto.DepartamentoDto;
import com.src.computec.facturacion.noclass.dto.EnvioNoClassDto;
import com.src.computec.facturacion.noclass.dto.MunicipioCentroPobladoDto;
import com.src.computec.facturacion.noclass.dto.NodoDistribucionDto;
import com.src.computec.facturacion.precosto.dto.OrdenProcesoDto;
import com.src.computec.radar.base.dao.GenericDAO;
import com.src.computec.radar.base.dao.exception.DAOException;
import com.src.computec.radar.services.utilities.dto.BaseExcelDto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;


/**
 *
 * @author Jose Luis Perea Alvarez
 */
public class NoClassDAO extends GenericDAO implements BaseNoClassDAO 
{
    ConstantesGenerales constantesGenerales = ConstantesGenerales.getInstance();    
        
    /** Creates a new instance of CargueDAO */
    public NoClassDAO() {
	com.src.computec.radar.services.base.constantes.ConstantesGenerales.getInstance();
    }
    
    public List getOrdenesProcesoNoClass(String filter) throws DAOException 
    {
        Connection con = null;
        PreparedStatement statement = null;
        PreparedStatement statement2 = null;
        
        List retornoLst = new ArrayList();
        
        ResultSet rs = null;
        ResultSet rs2 = null;
        
        try 
        {
            con = getConnectionDB2();
            
            statement = con.prepareStatement("SELECT OP.NUMERO_ORDEN, OP.CODIGO_CLIENTE, C.RAZON_SOCIAL, OP.CODIGO_PRODUCTO, P.DESCRIPCION_PRODUCTO, OP.CICLO, OP.FECHA_PROCESO, OP.NUMERO_FACTURA_COMPUTEC " +
                    "FROM " + SCHEMA + ".ORDEN_PROCESO OP " +
                    "INNER JOIN " + SCHEMA + ".CLIENTE C ON OP.CODIGO_CLIENTE = C.CODIGO_CLIENTE " +
                    "INNER JOIN " + SCHEMA + ".PRODUCTO P ON OP.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO " +
                    "WHERE OP.NUMERO_ORDEN = ? ");
            
            statement2 = con.prepareStatement("SELECT COUNT(E.CODIGO_BARRAS) AS NUMERO_NOCLASS " +
                    "FROM " + SCHEMA + ".ENVIO E " +
                    "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
                    "WHERE E.NUMERO_ORDEN = ? AND (E.CODIGO_DEPARTAMENTO = ? OR E.CODIGO_DEPARTAMENTO IS NULL) AND GE.CODIGO_TIPO_GESTION != ? ");
            
            
            int indice=0;
            
            statement.setObject(++indice, filter);
            rs = statement.executeQuery();           
            
            while(rs.next()) 
            {
                int indice1=0;
                
                OrdenProcesoDto dto = new OrdenProcesoDto();                
                dto.setNumeroOrden(rs.getString(++indice1));
                dto.setCodigoCliente(rs.getString(++indice1));
                dto.setRazonSocial(rs.getString(++indice1));
                dto.setCodigoProducto(rs.getString(++indice1));
                dto.setDescripcionProducto(rs.getString(++indice1));
                dto.setCiclo(rs.getString(++indice1));
                dto.setFechaProceso( ConstantesGenerales.STRING_DATE_FORMAT.format(rs.getDate(++indice1)) );
                dto.setClosed(rs.getString(++indice1) != null? true: false);               
                
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                indice1 = 0;
                statement2.setObject(++indice1,dto.getNumeroOrden());
                statement2.setObject(++indice, CODIGO_DANE_VACIO);
                statement2.setObject(++indice, constantesGenerales.ID_TIPO_GESTION_RETENCIONES);
                rs2 = statement2.executeQuery();
                
                if(rs2.next()) 
                {
                    indice1 = 0;                   
                    int numeroEnvios = rs2.getInt(++indice1);
                    dto.setNumeroNoClass(numeroEnvios);                    
                } 
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////             
                retornoLst.add(dto);
            }
        } 
        catch (SQLException e) 
        {
            throw new DAOException("NoClassDAO:getOrdenesProcesoNoClass: " +e.toString(), e);
        } 
        finally 
        {
            closeConnection(statement2,rs2);
            closeConnection(con, statement,rs);
        }
        return retornoLst;
    }
    
    public List getDepartamentos() throws DAOException {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CODIGO_DEPARTAMENTO, NOMBRE_DEPARTAMENTO " +
                    "FROM " + SCHEMA + ".DEPARTAMENTO " +
                    "ORDER BY NOMBRE_DEPARTAMENTO ASC");
            rs = statement.executeQuery();
            
            while (rs.next()) 
            {
                int indice1 = 0;
                DepartamentoDto departamentoDto = new DepartamentoDto();
                departamentoDto.setCodigoDepartamento(rs.getString(++indice1));
                departamentoDto.setNombreDepartamento(rs.getString(++indice1));
                retornoLst.add(departamentoDto);
            }
        }
        catch (SQLException e) 
        {
            throw new DAOException("NoClassDAO:getDepartamentos: " + e.toString(), e);
        } 
        finally 
        {
            closeConnection(con, statement, rs);
        }
        return retornoLst;
    }
    
    public List getMunicipiosByDepartamento(DepartamentoDto departamentoDto) throws DAOException {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT  CP.CODIGO_DEPARTAMENTO, CP.CODIGO_MUNICIPIO, CP.CODIGO_CENTROP, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO " +
                    "FROM " + SCHEMA + ".CENTRO_POBLADO CP " +
                    "INNER JOIN " + SCHEMA + ".MUNICIPIO M ON CP.CODIGO_DEPARTAMENTO = M.CODIGO_DEPARTAMENTO AND CP.CODIGO_MUNICIPIO = M.CODIGO_MUNICIPIO " +
                    "WHERE CP.CODIGO_DEPARTAMENTO = ? " +
                    "ORDER BY CP.NOMBRE_CENTRO_POBLADO, M.NOMBRE_MUNICIPIO  ASC ");
            
            int indice=0;
            
            statement.setObject(++indice, departamentoDto.getCodigoDepartamento());
            rs = statement.executeQuery();
            
            while (rs.next()) {
                int indice1 = 0;
                MunicipioCentroPobladoDto dto = new MunicipioCentroPobladoDto();
                dto.setCodigoDepartamento(rs.getString(++indice1));
                dto.setCodigoMunicipio(rs.getString(++indice1));
                dto.setCodigoCentroP(rs.getString(++indice1));
                dto.setNombreMunicipio(rs.getString(++indice1));
                dto.setNombreCentroP(rs.getString(++indice1));
                retornoLst.add(dto);
            }
        } catch (SQLException e) {
            throw new DAOException("NoClassDAO:getMunicipiosByDepartamento: " + e.toString(), e);
        } finally {
            closeConnection(con, statement, rs);
        }
        return retornoLst;
    }
    
    public List getNodosEmpresasMensajeria() throws DAOException 
    {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT P.CODIGO_PROVEEDOR, P.RAZON_SOCIAL, ND.CODIGO_NODO, ND.NOMBRE_NODO " +
                    "FROM " + SCHEMA + ".NODO_DISTRIBUCION ND " +
                    "INNER JOIN " + SCHEMA + ".PROVEEDOR P ON P.CODIGO_PROVEEDOR = ND.CODIGO_PROVEEDOR " +
                    "WHERE P.CODIGO_TIPO_PROVEEDOR = ? " +
                    "ORDER BY P.RAZON_SOCIAL, ND.NOMBRE_NODO ASC ");
            
            int indice=0;
            
            statement.setObject(++indice, CODIGO_TIPO_PROVEEDOR_MENSAJERIA);
            rs = statement.executeQuery();
            
            while (rs.next()) 
            {
                int indice1 = 0;
                NodoDistribucionDto dto = new NodoDistribucionDto();
                dto.setCodigoProveedor(rs.getString(++indice1));
                dto.setNombreProveedor(rs.getString(++indice1));
                dto.setCodigoNodo(rs.getString(++indice1));
                dto.setNombreNodo(rs.getString(++indice1));
                retornoLst.add(dto);
            }
        } 
        catch (SQLException e) {
            throw new DAOException("NoClassDAO:getNodosEmpresasMensajeria: " + e.toString(), e);
        } 
        finally {
            closeConnection(con, statement, rs);
        }
        return retornoLst;
    }
    
    public List getNodosEmpresasMensajeriaByOrdenesProceso(List ordenesLst) throws DAOException 
    {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        
        int numeroOrdenes = ordenesLst.size();
        
        try 
        {
            String cantidadOrdenes = "";
            for(int i = 0; i < numeroOrdenes;) 
            {
                cantidadOrdenes += (String)ordenesLst.get(i);
                if( ++i < numeroOrdenes ) 
                {
                    cantidadOrdenes += ",";
                }
            }      
       
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT DISTINCT P.CODIGO_PROVEEDOR, P.RAZON_SOCIAL, ND.CODIGO_NODO, ND.NOMBRE_NODO " +
                            "FROM " + SCHEMA + ".NODO_DISTRIBUCION ND " +
                            "INNER JOIN " + SCHEMA + ".PROVEEDOR P ON P.CODIGO_PROVEEDOR = ND.CODIGO_PROVEEDOR " +
                            "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO_DETALLE OPD ON ND.CODIGO_NODO = OPD.CODIGO_NODO " +
                            "WHERE OPD.NUMERO_ORDEN IN (" + cantidadOrdenes + ") AND P.CODIGO_TIPO_PROVEEDOR = ? " +
                            "ORDER BY P.RAZON_SOCIAL, ND.NOMBRE_NODO ASC");
            
            int indice=0;
            
            statement.setObject(++indice, CODIGO_TIPO_PROVEEDOR_MENSAJERIA);
            rs = statement.executeQuery();
            
            while (rs.next()) 
            {
                int indice1 = 0;
                NodoDistribucionDto dto = new NodoDistribucionDto();
                dto.setCodigoProveedor(rs.getString(++indice1));
                dto.setNombreProveedor(rs.getString(++indice1));
                dto.setCodigoNodo(rs.getString(++indice1));
                dto.setNombreNodo(rs.getString(++indice1));
                retornoLst.add(dto);
            }
        } 
        catch (SQLException e) {
            throw new DAOException("NoClassDAO:getNodosEmpresasMensajeria: " + e.toString(), e);
        } 
        finally {
            closeConnection(con, statement, rs);
        }
        return retornoLst;
    }
    
    public DepartamentoDto getDepartamentoByPrimaryKey(DepartamentoDto departamentoDto) throws DAOException 
    {
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        DepartamentoDto retornoDto = null;
        
        try 
        {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT CODIGO_DEPARTAMENTO, NOMBRE_DEPARTAMENTO " +
                    "FROM " + SCHEMA + ".DEPARTAMENTO " +
                    "WHERE CODIGO_DEPARTAMENTO = ? ");
            
            int indice = 0;
            
            statement.setObject(++indice, departamentoDto.getCodigoDepartamento());
            rs = statement.executeQuery();
            
            if(rs.next()) 
            {
                int indice1 = 0;
                retornoDto = new DepartamentoDto();
                retornoDto.setCodigoDepartamento(rs.getString(++indice1));
                retornoDto.setNombreDepartamento(rs.getString(++indice1));
            }
        } 
        catch (SQLException e) 
        {
            throw new DAOException("NoClassDAO:getDepartamentoByPrimaryKey: " + e.toString(), e);
        } 
        finally 
        {
            closeConnection(con, statement, rs);
        }        
        return retornoDto;
    }
    
    public MunicipioCentroPobladoDto getMunicipioByPrimaryKey(MunicipioCentroPobladoDto municipioCentroPobladoDto) throws DAOException {
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        MunicipioCentroPobladoDto retornoDto = null;
        
        try 
        {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT  CP.CODIGO_DEPARTAMENTO, CP.CODIGO_MUNICIPIO, CP.CODIGO_CENTROP, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO " +
                    "FROM " + SCHEMA + ".CENTRO_POBLADO CP " +
                    "INNER JOIN " + SCHEMA + ".MUNICIPIO M ON CP.CODIGO_DEPARTAMENTO = M.CODIGO_DEPARTAMENTO AND CP.CODIGO_MUNICIPIO = M.CODIGO_MUNICIPIO " +
                    "WHERE CP.CODIGO_DEPARTAMENTO = ? AND CP.CODIGO_MUNICIPIO = ? AND CP.CODIGO_CENTROP = ? ");
            
            int indice=0;
            
            statement.setObject(++indice, municipioCentroPobladoDto.getCodigoDepartamento());
            statement.setObject(++indice, municipioCentroPobladoDto.getCodigoMunicipio());
            statement.setObject(++indice, municipioCentroPobladoDto.getCodigoCentroP());
            rs = statement.executeQuery();
            
            while (rs.next()) 
            {
                int indice1 = 0;
                retornoDto = new MunicipioCentroPobladoDto();
                retornoDto.setCodigoDepartamento(rs.getString(++indice1));
                retornoDto.setCodigoMunicipio(rs.getString(++indice1));
                retornoDto.setCodigoCentroP(rs.getString(++indice1));
                retornoDto.setNombreMunicipio(rs.getString(++indice1));
                retornoDto.setNombreCentroP(rs.getString(++indice1));
            }
        } 
        catch (SQLException e) 
        {
            throw new DAOException("NoClassDAO:getMunicipiosByDepartamento: " + e.toString(), e);
        } 
        finally 
        {
            closeConnection(con, statement, rs);
        }
        return retornoDto;
    }
    
    public NodoDistribucionDto getNodoEmpresaMensajeriaByPrimaryKey(NodoDistribucionDto nodoDistribucionDto) throws DAOException 
    {
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        NodoDistribucionDto retornoDto = null;
        
        try {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT P.CODIGO_PROVEEDOR, P.RAZON_SOCIAL, ND.CODIGO_NODO, ND.NOMBRE_NODO " +
                    "FROM " + SCHEMA + ".NODO_DISTRIBUCION ND " +
                    "INNER JOIN " + SCHEMA + ".PROVEEDOR P ON P.CODIGO_PROVEEDOR = ND.CODIGO_PROVEEDOR " +
                    "WHERE P.CODIGO_PROVEEDOR = ? AND ND.CODIGO_NODO = ? ");
            
            int indice=0;
            
            statement.setObject(++indice, nodoDistribucionDto.getCodigoProveedor());
            statement.setObject(++indice, nodoDistribucionDto.getCodigoNodo());
            rs = statement.executeQuery();
            
            while (rs.next()) 
            {
                int indice1 = 0;
                retornoDto = new NodoDistribucionDto();
                retornoDto.setCodigoProveedor(rs.getString(++indice1));
                retornoDto.setNombreProveedor(rs.getString(++indice1));
                retornoDto.setCodigoNodo(rs.getString(++indice1));
                retornoDto.setNombreNodo(rs.getString(++indice1));                
            }
        } 
        catch (SQLException e) {
            throw new DAOException("NoClassDAO:getNodoEmpresaMensajeriaByPrimaryKey: " + e.toString(), e);
        } 
        finally {
            closeConnection(con, statement, rs);
        }
        return retornoDto;
    }
    
    public List getSitiosOriginalesSinClasificarByOrdenes(List ordenesLst) throws DAOException 
    {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;
        //PreparedStatement statement3 = null;
        ResultSet rs1 = null;
        ResultSet rs2 = null;
        //ResultSet rs3 = null;        
        int cantidadOrdenes = ordenesLst.size();
        
        try 
        {
            String numeroOrdenes = "";
            for(int i = 0; i < cantidadOrdenes;) 
            {
                numeroOrdenes += (String)ordenesLst.get(i);
                if( ++i < cantidadOrdenes ) 
                {
                    numeroOrdenes += ",";
                }
            }            
                        
            con = getConnectionDB2();            
            statement1 = con.prepareStatement(  "SELECT T.SITIO_ORIGINAL, T.RETENER FROM " +
                                                "( " +
                                                    "(SELECT E.SITIO_ORIGINAL, 'false' AS RETENER " +
                                                    "FROM " + SCHEMA + ".ENVIO E " +
                                                    "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
                                                    "WHERE E.NUMERO_ORDEN IN (" + numeroOrdenes + ") AND E.SITIO_ORIGINAL IS NOT NULL AND " +
                                                        "(E.CODIGO_DEPARTAMENTO = ? OR E.CODIGO_DEPARTAMENTO IS NULL) AND " +
                                                        "GE.CODIGO_TIPO_GESTION NOT IN (?,?) " +
                                                    "GROUP BY E.SITIO_ORIGINAL) " +
                                                    "UNION " +
                                                    "(SELECT E.SITIO_ORIGINAL, 'true' AS RETENER " +
                                                    "FROM " + SCHEMA + ".ENVIO E " +
                                                    "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
                                                    "WHERE E.NUMERO_ORDEN IN (" + numeroOrdenes + ") AND E.SITIO_ORIGINAL IS NOT NULL AND " +
                                                        "(E.CODIGO_DEPARTAMENTO = ? OR E.CODIGO_DEPARTAMENTO IS NULL) AND " +
                                                        "GE.CODIGO_TIPO_GESTION IN (?) " +
                                                    "GROUP BY E.SITIO_ORIGINAL) " +
                                                ") T " +
                                                "ORDER BY T.SITIO_ORIGINAL ASC, T.RETENER ASC");
            
            statement2 = con.prepareStatement("SELECT NUMERO_ORDEN " +
                                              "FROM " + SCHEMA + ".ENVIO " +
                                              "WHERE NUMERO_ORDEN IN (" + numeroOrdenes + ") AND SITIO_ORIGINAL = ? " +
                                              "GROUP BY NUMERO_ORDEN");
            
            /*statement3 = con.prepareStatement("SELECT NUMERO_ORDEN, CODIGO_BARRAS " +
                                              "FROM " + SCHEMA + ".ENVIO " +
                                              "WHERE NUMERO_ORDEN IN (" + numeroOrdenes + ") AND SITIO_ORIGINAL = ? ");*/
            
            
            int indice=0;
            
            statement1.setObject(++indice, CODIGO_DANE_VACIO);
            statement1.setObject(++indice, constantesGenerales.ID_TIPO_GESTION_EN_PROCESO);
            statement1.setObject(++indice, constantesGenerales.ID_TIPO_GESTION_RETENCIONES);
            statement1.setObject(++indice, CODIGO_DANE_VACIO);
            statement1.setObject(++indice, constantesGenerales.ID_TIPO_GESTION_EN_PROCESO);            
            rs1 = statement1.executeQuery();
            
            while (rs1.next()) 
            {
                int indice1 = 0;
                ClasificacionDto dto = new ClasificacionDto();
                dto.setSitioOriginal(rs1.getString(++indice1));
                dto.setPuedeReternerse( rs1.getString(++indice1).equals("true") ? true: false);
                
                if( !retornoLst.contains(dto) )
                {
                    List ordenesProceso = new ArrayList();
                    List ordenesCodigoBarras = new ArrayList();

                    //////////////////////////////////////////////////////////////////////////////////
                    ////////// Trae las ordenes de proceso dentro del  dto  ClasificacionDto   ///////
                    //////////////////////////////////////////////////////////////////////////////////
                    indice1 = 0;
                    statement2.setObject(++indice1,dto.getSitioOriginal());
                    rs2 = statement2.executeQuery();

                    while (rs2.next()) 
                    {
                        int indice2 = 0;
                        ordenesProceso.add(rs2.getString(++indice2));
                    }
                    ////////////////////////////////////////////////////////////////////////////////////////
                    ////////// Trae los codigos de barra correspondientes a cada orden de proceso //////////
                    ////////// dentro del  dto  ClasificacionDto                                  //////////
                    ////////////////////////////////////////////////////////////////////////////////////////
                    /*
                    indice1 = 0;
                    statement3.setObject(++indice1,dto.getSitioOriginal());
                    rs3 = statement3.executeQuery();

                    while (rs3.next()) 
                    {
                        int indice2 = 0;
                        EnvioNoClassDto envioNoClassDto = new EnvioNoClassDto();
                        envioNoClassDto.setNumeroOrden(rs3.getString(++indice2));
                        envioNoClassDto.setCodigoBarras(rs3.getString(++indice2));

                        ordenesCodigoBarras.add(envioNoClassDto);
                    }*/
                    //////////////////////////////////////////////////////////////////////////////////
                    //////////////////////////////////////////////////////////////////////////////////

                    dto.setOrdenesProceso(ordenesProceso);
                    dto.setOrdenesCodigoBarras(ordenesCodigoBarras);
                    retornoLst.add(dto);
                }
            }
        } 
        catch (SQLException e) 
        {
	    e.printStackTrace();
            throw new DAOException("NoClassDAO:getSitiosOriginalesSinClasificarByOrdenes: " + e.toString(), e);
        } 
        finally {
            //closeConnection(statement3, rs3);
            closeConnection(statement2, rs2);
            closeConnection(con, statement1, rs1);
        }
        return retornoLst;
    }
    
    public List clasificarEnvios(List enviosNoClass) throws DAOException 
    {
        Connection con = null;
        PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;
        PreparedStatement statement3 = null;
	
	
        List retornoLst = new ArrayList();
	List noClassLst = new ArrayList();
	List baseEm=new ArrayList();
	
        try
        {
            Timestamp todayTime = new Timestamp( (new Date()).getTime() );
            
            con = getConnectionDB2();
            statement1 = con.prepareStatement("UPDATE " + SCHEMA + ".ENVIO_NOCLAS " +
                                              "SET CODIGO_DEPARTAMENTO = ?, CODIGO_MUNICIPIO = ?, CODIGO_CENTROP = ?, FECHA_MOVIMIENTO = ?, CODIGO_ESTADO=?, CODIGO_RESPONSABLE=? " +
                                              "WHERE NUMERO_ORDEN = ? AND SITIO_ORIGINAL = ? ");
            
            statement2 = con.prepareStatement("UPDATE " + SCHEMA + ".ENVIO " +
                                              "SET CODIGO_DEPARTAMENTO = ?, CODIGO_MUNICIPIO = ?, CODIGO_CENTROP = ?, CODIGO_NODO = ? " +
                                              "WHERE NUMERO_ORDEN = ? AND SITIO_ORIGINAL = ? AND " +
                                              "(CODIGO_DEPARTAMENTO = " + CODIGO_DANE_VACIO + " OR CODIGO_DEPARTAMENTO IS NULL) AND " +
                                              "(CODIGO_NODO = " + CODIGO_DANE_VACIO + " OR CODIGO_NODO IS NULL) ");
            
            statement3 = con.prepareStatement("UPDATE " + SCHEMA + ".ENVIO " +
                                              "SET CODIGO_DEPARTAMENTO = ?, CODIGO_MUNICIPIO = ?, CODIGO_CENTROP = ? " +
                                              "WHERE NUMERO_ORDEN = ? AND SITIO_ORIGINAL = ? AND " +
                                              "(CODIGO_DEPARTAMENTO = " + CODIGO_DANE_VACIO + " OR CODIGO_DEPARTAMENTO IS NULL) AND " +
                                              "CODIGO_NODO != " + CODIGO_DANE_VACIO + " AND CODIGO_NODO IS NOT NULL ");
	    
	  

	   
        
            Iterator clasificacionIter = enviosNoClass.iterator();        
            while (clasificacionIter.hasNext()) 
            {		
                ClasificacionDto clasificacionDto = (ClasificacionDto)clasificacionIter.next();
                int indice1 = 0;
                statement1.setObject(++indice1,clasificacionDto.getCodigoDepartamento());
                statement1.setObject(++indice1,clasificacionDto.getCodigoMunicipio());
                statement1.setObject(++indice1,clasificacionDto.getCodigoCentroP());		
                statement1.setObject(++indice1,todayTime);                
		
		statement1.setObject(++indice1,NO_CLASS_NO_GENERADO);
		statement1.setObject(++indice1,clasificacionDto.getCodigoResponsable());
                
                int indice2 = 0;
                statement2.setObject(++indice2,clasificacionDto.getCodigoDepartamento());
                statement2.setObject(++indice2,clasificacionDto.getCodigoMunicipio());
                statement2.setObject(++indice2,clasificacionDto.getCodigoCentroP());
                statement2.setObject(++indice2,clasificacionDto.getCodigoNodo());             
                
                int indice3 = 0;
                statement3.setObject(++indice3,clasificacionDto.getCodigoDepartamento());
                statement3.setObject(++indice3,clasificacionDto.getCodigoMunicipio());
                statement3.setObject(++indice3,clasificacionDto.getCodigoCentroP());                         
                
				
                indice1++;
                indice2++;
                indice3++;
                
                Iterator ordenesProcesoIter = clasificacionDto.getOrdenesProceso().iterator();
                while(ordenesProcesoIter.hasNext())
                {
		     String ordenProceso = (String)ordenesProcesoIter.next();
		    
		  

		    
                    statement3.setObject(indice3,ordenProceso);
                    statement3.setObject(indice3 + 1,clasificacionDto.getSitioOriginal());
                    statement3.executeUpdate(); 
                    
                    statement2.setObject(indice2,ordenProceso);
                    statement2.setObject(indice2 + 1,clasificacionDto.getSitioOriginal());
                    statement2.executeUpdate(); 
                    
                    statement1.setObject(indice1,ordenProceso);
                    statement1.setObject(indice1 + 1,clasificacionDto.getSitioOriginal());
                    statement1.executeUpdate();
		    
		    baseEm.add(this.debeGenerarBaseEM(ordenProceso));		   
		
		
                }                
                clasificacionDto.setCorrected(true);
                noClassLst.add(clasificacionDto);            
            }
	    retornoLst.add(noClassLst);
	    retornoLst.add(baseEm);
	   
        }
        catch (SQLException e)
        {
            throw new DAOException("NoClassDAO:clasificarEnvios: " + e.toString(), e);
        }
        finally
        {
            closeConnection(null, statement3);
            closeConnection(null, statement2);
	   
            closeConnection(con, statement1);
        }
        return retornoLst;
    }
    
    
    /**
     * Retorna una lista de registro para generar la base para empresas de mensajeria
     * @param Lista String codigos de barras
     * @return HashMap de Lista BaseExcelDto
     * @throws com.src.computec.radar.base.dao.exception.DAOException 
     */
    public HashMap getBaseEmXCodBarras(String pCodBarras) throws DAOException 
    {
        Connection con = null;
        
	PreparedStatement statement4 = null;
	PreparedStatement statementUpdate=null;
	ResultSet result4=null;
	HashMap hashList_=new HashMap();
	
      
        try
        {
	      con = getConnectionDB2();
	     //Query para generacion de bases para empresas de mensajeria
	    String query_="SELECT  NOD.NOMBRE_NODO,CLI.RAZON_SOCIAL,PROD.DESCRIPCION_PRODUCTO,E.NUMERO_ORDEN,E.CONSECUTIVO_ENVIO,E.CODIGO_BARRAS,E.DIRECCION_DESTINATARIO,DEP.NOMBRE_DEPARTAMENTO,MUN.NOMBRE_MUNICIPIO,CEP.NOMBRE_CENTRO_POBLADO,E.CODIGO_NODO,E.ZONA_POSTAL " +
			    "FROM PRODRAD.ENVIO E " +
			 //   "INNER JOIN PRODRAD.DOCUMENTO DOC ON DOC.CODIGO_BARRAS=E.CODIGO_BARRAS " +
			    "INNER JOIN PRODRAD.ENVIO_NOCLAS ENV ON ENV.CODIGO_BARRAS=E.CODIGO_BARRAS " +
			    "INNER JOIN PRODRAD.NODO_DISTRIBUCION NOD ON NOD.CODIGO_NODO=E.CODIGO_NODO " +
			    "INNER JOIN PRODRAD.CLIENTE CLI ON CLI.CODIGO_CLIENTE=E.CODIGO_CLIENTE " +
			    "INNER JOIN PRODRAD.PRODUCTO PROD ON PROD.CODIGO_PRODUCTO=E.CODIGO_PRODUCTO " +
			    "INNER JOIN PRODRAD.DEPARTAMENTO DEP ON DEP.CODIGO_DEPARTAMENTO=E.CODIGO_DEPARTAMENTO " +
			    "INNER JOIN PRODRAD.MUNICIPIO MUN ON (MUN.CODIGO_DEPARTAMENTO=E.CODIGO_DEPARTAMENTO AND MUN.CODIGO_MUNICIPIO=E.CODIGO_MUNICIPIO) " +
			    "INNER JOIN PRODRAD.CENTRO_POBLADO CEP ON (CEP.CODIGO_DEPARTAMENTO=E.CODIGO_DEPARTAMENTO AND CEP.CODIGO_MUNICIPIO=E.CODIGO_MUNICIPIO AND CEP.CODIGO_CENTROP=E.CODIGO_CENTROP) " +
			    "WHERE ENV.NUMERO_ORDEN in (SELECT NUMERO_ORDEN FROM PRODRAD.ENVIO WHERE CODIGO_BARRAS="+pCodBarras+") "+
			    "AND ENV.CODIGO_ESTADO="+NO_CLASS_NO_GENERADO;
	    
		 String queryUpdate_="UPDATE PRODRAD.ENVIO_NOCLAS SET CODIGO_ESTADO="+NO_CLASS_GENERADO+" WHERE NUMERO_ORDEN in (SELECT NUMERO_ORDEN FROM PRODRAD.ENVIO WHERE CODIGO_BARRAS="+pCodBarras+") AND CODIGO_ESTADO="+NO_CLASS_NO_GENERADO;
            

	    //Query generacion base de empresas de mensajeria 
	    //------------------------------------------------    
	    
	    statement4=con.prepareStatement(query_);
	    result4=statement4.executeQuery();
	    statementUpdate=con.prepareStatement(queryUpdate_);
	    statementUpdate.executeUpdate();



	    while(result4.next()){


		BaseExcelDto baseDto_=new BaseExcelDto();
		int indice1=0;
		baseDto_.setNombreNodo(result4.getString(++indice1));
		baseDto_.setClienteRazonSoc(result4.getString(++indice1));
		baseDto_.setDescProducto(result4.getString(++indice1));
		baseDto_.setNumOrden(result4.getInt(++indice1));
		baseDto_.setConsecutivoEnvio(result4.getInt(++indice1));
		baseDto_.setCodBarras(result4.getString(++indice1));
		//baseDto_.setCodigoInternoCli(result4.getString(++indice1));
		baseDto_.setDireccion(result4.getString(++indice1));
		baseDto_.setDepartamento(result4.getString(++indice1));
		baseDto_.setMunicipio(result4.getString(++indice1));
		baseDto_.setCentroPoblado(result4.getString(++indice1));	
		
		String codigoNodo_=result4.getString(++indice1);
		baseDto_.setZona(result4.getString(++indice1));	
		String key_=baseDto_.getNumOrden()+"-"+codigoNodo_;
		if(hashList_.containsKey(key_)){
		    ArrayList list_=(ArrayList)hashList_.get(key_);
		    list_.add(baseDto_);
		    //hashList_.put(key_, list_);
		}else{
		    ArrayList list_=new ArrayList();
		    list_.add(baseDto_);
		    hashList_.put(key_,list_);
		}
		
		
	    }
	    
	}catch (SQLException e)
        {
            throw new DAOException("NoClassDAO:getBaseEmXCodBarras: " + e.toString(), e);
        }
        finally
        {
	    closeConnection(null, statementUpdate);
            closeConnection(con, statement4,result4);
        }
        return hashList_;
    }
    
     /**
     * Retorna HashMap Base si debe generar base cuando se han clasificado todos los codigos de barras de una orden 
     * @param String Numero Orden
     * @return HashMap
     * @throws com.src.computec.radar.base.dao.exception.DAOException 
     */
    public HashMap debeGenerarBaseEM(String pNumOrden) throws DAOException 
    {
        Connection con = null;
        
	PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;
	
	ResultSet result1=null;
	ResultSet result2=null;
	HashMap retHash=new HashMap();
	
        try
        {
	      con = getConnectionDB2();
	   //Conteo de Codigos de barras clasificados
	    String query1_="SELECT count(E.CODIGO_BARRAS) " +
		    "FROM "+SCHEMA+".ENVIO_NOCLAS E " +
		    "WHERE E.NUMERO_ORDEN = " +pNumOrden+" "+
		    //"AND (E.CODIGO_DEPARTAMENTO = 0 OR E.CODIGO_DEPARTAMENTO IS NULL)  " +
		    "AND E.CODIGO_ESTADO="+NO_CLASS_NO_GENERADO;
	    
	    //Total de codigos de barras que se deben clasificar restando los que estan en retencion y ya generados que no deberia haber para esa orden
	    String query2_="SELECT count(E.CODIGO_BARRAS) " +
		    "FROM "+SCHEMA+".ENVIO_NOCLAS E " +
		    "WHERE E.NUMERO_ORDEN = " +pNumOrden+" "+
		    //"AND (E.CODIGO_DEPARTAMENTO = 0 OR E.CODIGO_DEPARTAMENTO IS NULL) " +
		    "AND (E.CODIGO_ESTADO="+NO_CLASS_ORIGINAL+" OR E.CODIGO_ESTADO="+NO_CLASS_NO_GENERADO+")";
		        
	    
	    statement1=con.prepareStatement(query1_);
	    result1=statement1.executeQuery();
	    
	    statement2=con.prepareStatement(query2_);
	    result2=statement2.executeQuery();

	    int countEstado1_=0;
	    int countTotal_=0;
	    while(result1.next()){
		int indice1=0;
		countEstado1_=Integer.parseInt(result1.getString(++indice1));
	    }
	    while(result2.next()){
		int indice2=0;
		countTotal_=Integer.parseInt(result2.getString(++indice2));
	    }
	    //Si son iguales significa que ya estan todos clasificados y se debe generar la base
	    System.out.println("AGRUPADO "+pNumOrden+" ESTADO1="+countEstado1_+"- TOTAL="+countTotal_);
	    if(countEstado1_==countTotal_ && countEstado1_>0){
		System.out.println("SE GENERARA BASE EM");
		retHash=this.getBaseEmXNumOrden(pNumOrden);
		System.out.println("#NODOS-retHash.size()="+retHash.size());
	    }else{
		System.out.println("NO SE GENERA BASE EM");
	    }	    
	}catch (SQLException e)
        {
            throw new DAOException("NoClassDAO:debeGenerarBaseEM: " + e.toString(), e);
        }
        finally
        {
	    closeConnection(null, statement2,result2);
            closeConnection(con, statement1,result1);
        }
        return retHash;
    }
    
    
     /**
     * Retorna HashMap Base si debe generar base cuando se han clasificado todos los codigos de barras de una orden 
     * @param String Numero Orden
     * @return HashMap
     * @throws com.src.computec.radar.base.dao.exception.DAOException 
     */
    public HashMap debeGenerarBaseEMXCodbar(String pCodBarras) throws DAOException 
    {
        Connection con = null;
        
	PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;
	
	ResultSet result1=null;
	ResultSet result2=null;
	HashMap retHash=new HashMap();
	
        try
        {
	      con = getConnectionDB2();
	   //Conteo de Codigos de barras clasificados
	    String query1_="SELECT count(E.CODIGO_BARRAS) " +
		    "FROM "+SCHEMA+".ENVIO_NOCLAS E " +
		    "WHERE E.NUMERO_ORDEN in (SELECT NUMERO_ORDEN FROM PRODRAD.ENVIO WHERE CODIGO_BARRAS="+pCodBarras+") "+
		//    "AND (E.CODIGO_DEPARTAMENTO = 0 OR E.CODIGO_DEPARTAMENTO IS NULL)  " +
		    "AND E.CODIGO_ESTADO="+NO_CLASS_NO_GENERADO;
	    
	    //Total de codigos de barras que se deben clasificar restando los que estan en retencion y ya generados que no deberia haber para esa orden
	    String query2_="SELECT count(E.CODIGO_BARRAS) " +
		    "FROM "+SCHEMA+".ENVIO_NOCLAS E " +
		    "WHERE E.NUMERO_ORDEN in (SELECT NUMERO_ORDEN FROM PRODRAD.ENVIO WHERE CODIGO_BARRAS="+pCodBarras+") "+
		 //   "AND (E.CODIGO_DEPARTAMENTO = 0 OR E.CODIGO_DEPARTAMENTO IS NULL) " +
		    "AND (E.CODIGO_ESTADO="+NO_CLASS_ORIGINAL+" OR E.CODIGO_ESTADO="+NO_CLASS_NO_GENERADO+")";
		        
	    
	    statement1=con.prepareStatement(query1_);
	    result1=statement1.executeQuery();
	    
	    statement2=con.prepareStatement(query2_);
	    result2=statement2.executeQuery();

	    int countEstado1_=0;
	    int countTotal_=0;
	    while(result1.next()){
		int indice1=0;
		countEstado1_=Integer.parseInt(result1.getString(++indice1));
	    }
	    while(result2.next()){
		int indice2=0;
		countTotal_=Integer.parseInt(result2.getString(++indice2));
	    }
	    //Si son iguales significa que ya estan todos clasificados y se debe generar la base
	    System.out.println("DETALLADO "+pCodBarras+" ESTADO1="+countEstado1_+"- TOTAL="+countTotal_);
	    if(countEstado1_==countTotal_ && countEstado1_>0){
		System.out.println("SE GENERARA BASE EM");
		retHash=this.getBaseEmXCodBarras(pCodBarras);
	    }
	    
	}catch (SQLException e)
        {
            throw new DAOException("NoClassDAO:debeGenerarBaseEM: " + e.toString(), e);
        }
        finally
        {
	    closeConnection(null, statement2,result2);
            closeConnection(con, statement1,result1);
        }
        return retHash;
    }
    
    /**
     * Retorna una lista de registros para generar la base para empresas de mensajeria
     * @param Lista String numero orden
     * @return Lista BaseExcelDto
     * @throws com.src.computec.radar.base.dao.exception.DAOException 
     */
    public HashMap getBaseEmXNumOrden(String pNumOrden) throws DAOException 
    {
        Connection con = null;
        
	PreparedStatement statement4 = null;
        PreparedStatement statementUpdate = null;
	
	ResultSet result4=null;
	HashMap hashList_=new HashMap();
	
      
        try
        {
	      con = getConnectionDB2();
	     //Query para generacion de bases para empresas de mensajeria
	    String query_="SELECT  NOD.NOMBRE_NODO,CLI.RAZON_SOCIAL,PROD.DESCRIPCION_PRODUCTO,E.NUMERO_ORDEN,E.CONSECUTIVO_ENVIO,E.CODIGO_BARRAS,E.DIRECCION_DESTINATARIO,DEP.NOMBRE_DEPARTAMENTO,MUN.NOMBRE_MUNICIPIO,CEP.NOMBRE_CENTRO_POBLADO,E.CODIGO_NODO,E.ZONA_POSTAL " +
			    "FROM PRODRAD.ENVIO E " +
			  //  "INNER JOIN PRODRAD.DOCUMENTO DOC ON DOC.CODIGO_BARRAS=E.CODIGO_BARRAS " +
			    "INNER JOIN PRODRAD.ENVIO_NOCLAS ENV ON ENV.CODIGO_BARRAS=E.CODIGO_BARRAS " +
			    "INNER JOIN PRODRAD.NODO_DISTRIBUCION NOD ON NOD.CODIGO_NODO=E.CODIGO_NODO " +
			    "INNER JOIN PRODRAD.CLIENTE CLI ON CLI.CODIGO_CLIENTE=E.CODIGO_CLIENTE " +
			    "INNER JOIN PRODRAD.PRODUCTO PROD ON PROD.CODIGO_PRODUCTO=E.CODIGO_PRODUCTO " +
			    "INNER JOIN PRODRAD.DEPARTAMENTO DEP ON DEP.CODIGO_DEPARTAMENTO=E.CODIGO_DEPARTAMENTO " +
			    "INNER JOIN PRODRAD.MUNICIPIO MUN ON (MUN.CODIGO_DEPARTAMENTO=E.CODIGO_DEPARTAMENTO AND MUN.CODIGO_MUNICIPIO=E.CODIGO_MUNICIPIO) " +
			    "INNER JOIN PRODRAD.CENTRO_POBLADO CEP ON (CEP.CODIGO_DEPARTAMENTO=E.CODIGO_DEPARTAMENTO AND CEP.CODIGO_MUNICIPIO=E.CODIGO_MUNICIPIO AND CEP.CODIGO_CENTROP=E.CODIGO_CENTROP) " +
			    "WHERE ENV.NUMERO_ORDEN = " +pNumOrden+" "+
			    "AND ENV.CODIGO_ESTADO="+NO_CLASS_NO_GENERADO;
	    
		 
            
	    String queryUpdate_="UPDATE PRODRAD.ENVIO_NOCLAS SET CODIGO_ESTADO="+NO_CLASS_GENERADO+" WHERE NUMERO_ORDEN ="+pNumOrden+" AND CODIGO_ESTADO="+NO_CLASS_NO_GENERADO;
	    
	    //Query generacion base de empresas de mensajeria 
	    //------------------------------------------------    
	    
	    statement4=con.prepareStatement(query_);
	    statementUpdate=con.prepareStatement(queryUpdate_);
	    result4=statement4.executeQuery();
	    statementUpdate.executeUpdate();



	    while(result4.next()){


		BaseExcelDto baseDto_=new BaseExcelDto();
		int indice1=0;
		baseDto_.setNombreNodo(result4.getString(++indice1));
		baseDto_.setClienteRazonSoc(result4.getString(++indice1));
		baseDto_.setDescProducto(result4.getString(++indice1));
		baseDto_.setNumOrden(result4.getInt(++indice1));
		baseDto_.setConsecutivoEnvio(result4.getInt(++indice1));
		baseDto_.setCodBarras(result4.getString(++indice1));
		//baseDto_.setCodigoInternoCli(result4.getString(++indice1));
		baseDto_.setDireccion(result4.getString(++indice1));
		baseDto_.setDepartamento(result4.getString(++indice1));
		baseDto_.setMunicipio(result4.getString(++indice1));
		baseDto_.setCentroPoblado(result4.getString(++indice1));	
		
		String codigoNodo_=result4.getString(++indice1);
		baseDto_.setZona(result4.getString(++indice1));
		
		String key_=baseDto_.getNumOrden()+"-"+codigoNodo_;
		if(hashList_.containsKey(key_)){
		    ArrayList list_=(ArrayList)hashList_.get(key_);
		    list_.add(baseDto_);
		    //hashList_.put(key_, list_);
		}else{
		    ArrayList list_=new ArrayList();
		    list_.add(baseDto_);
		    hashList_.put(key_,list_);
		}
		
		
	    }
	    
	}catch (SQLException e)
        {
            throw new DAOException("NoClassDAO:getBaseEmXNumOrden: " + e.toString(), e);
        }
        finally
        {
	    closeConnection(null, statementUpdate);
            closeConnection(con, statement4,result4);
        }
        return hashList_;
    }
    
    
    public void retenerEnviosBySitioOriginal(ClasificacionDto clasificacionDto) throws DAOException 
    {
        Connection con = null;
        PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;
        //PreparedStatement statement3 = null;
        PreparedStatement statement4 = null;
	PreparedStatement statement5 = null;
        
        ResultSet rs1 = null;
        List ordenesLst = clasificacionDto.getOrdenesProceso();
        int cantidadOrdenes = ordenesLst.size();
        
        Timestamp todayTime = new Timestamp( (new Date()).getTime() );
        try
        {
            String numeroOrdenes = "";
            for(int i = 0; i < cantidadOrdenes;) 
            {
                numeroOrdenes += (String)ordenesLst.get(i);
                if( ++i < cantidadOrdenes ) 
                {
                    numeroOrdenes += ",";
                }
            }       
            
            con = getConnectionDB2();            
            
            statement1 = con.prepareStatement("SELECT CODIGO_BARRAS " +
                                              "FROM "+ SCHEMA +".ENVIO " +
                                              "WHERE NUMERO_ORDEN IN (" + numeroOrdenes + ") AND CODIGO_ULTIMA_GESTION IN (" + constantesGenerales.IDS_GESTION_PUEDE_RETENER + ") AND " +
                                                   "SITIO_ORIGINAL = ? AND " +
                                                   "(CODIGO_DEPARTAMENTO = ? OR CODIGO_DEPARTAMENTO IS NULL)");
            
            statement2 = con.prepareStatement("UPDATE "+ SCHEMA +".ENVIO SET CODIGO_ULTIMA_GESTION = ?, FECHA_ULTIMA_GESTION = ? " +
                                              "WHERE NUMERO_ORDEN IN (" + numeroOrdenes + ") AND CODIGO_ULTIMA_GESTION IN (" + constantesGenerales.IDS_GESTION_PUEDE_RETENER + ") AND " +
                                                   "SITIO_ORIGINAL = ? AND " +
                                                   "(CODIGO_DEPARTAMENTO = ? OR CODIGO_DEPARTAMENTO IS NULL)");
            
            /*statement3 = con.prepareStatement("DELETE FROM "+ SCHEMA +".ENVIO_NOCLAS " +
                                              "WHERE NUMERO_ORDEN IN (" + numeroOrdenes + ") AND " +
                                                   "SITIO_ORIGINAL = ? AND " +
                                                   "(CODIGO_DEPARTAMENTO = ? OR CODIGO_DEPARTAMENTO IS NULL)");*/
            
            statement4   = con.prepareStatement("INSERT INTO "+ SCHEMA +".ENVIO_MOVIMIENTO (CODIGO_BARRAS,CODIGO_GESTION,FECHA_MOVIMIENTO,FECHA_WEB,FECHA_CARGA_WEB,CODIGO_RESPONSABLE) VALUES (?,?,?,?,?,'"+ clasificacionDto.getCodigoResponsable() +"') ");
            
	    
	    statement5   = con.prepareStatement("UPDATE PRODRAD.ENVIO_NOCLAS SET FECHA_MOVIMIENTO = ?, CODIGO_ESTADO="+NO_CLASS_RETENCION+", CODIGO_RESPONSABLE=? " +
						"WHERE NUMERO_ORDEN IN (" + numeroOrdenes + ") AND " +
                                                   "SITIO_ORIGINAL = ? AND " +
                                                   "(CODIGO_DEPARTAMENTO = ? OR CODIGO_DEPARTAMENTO IS NULL)");
	    
            List enviosARetener = new ArrayList();
            int indice = 0;
            
            /////////////////////////////////////////////////////////////////////////////////////////////
            /////  Traigo los codigos de barras que se van a ver afectados con la retencion ilocalizable
            statement1.setObject(++indice,clasificacionDto.getSitioOriginal());
            statement1.setObject(++indice, CODIGO_DANE_VACIO);
            rs1 = statement1.executeQuery();
            
            while (rs1.next()) 
            {
                int indice1 = 0;
                EnvioNoClassDto envioNoClassDto = new EnvioNoClassDto();
                envioNoClassDto.setCodigoBarras(rs1.getString(++indice1));
                enviosARetener.add(envioNoClassDto);
            }
            
            indice = 0;
            statement2.setObject(++indice,constantesGenerales.ID_GESTION_RETENCION_ILOCALIZABLE);
            statement2.setObject(++indice,new java.sql.Date((new java.util.Date()).getTime()));
            statement2.setObject(++indice,clasificacionDto.getSitioOriginal());
            statement2.setObject(++indice, CODIGO_DANE_VACIO);
            statement2.executeUpdate(); 
            
            /*indice = 0;
            statement3.setObject(++indice, clasificacionDto.getSitioOriginal());
            statement3.setObject(++indice, CODIGO_DANE_VACIO);
            statement3.executeUpdate();*/
	    
	    indice = 0;
	    statement5.setObject(++indice,todayTime);
	    statement5.setObject(++indice, clasificacionDto.getCodigoResponsable());
            statement5.setObject(++indice, clasificacionDto.getSitioOriginal());
            statement5.setObject(++indice, CODIGO_DANE_VACIO);
            statement5.executeUpdate();
            
            Iterator iterEnviosARetener = enviosARetener.iterator();            
            while(iterEnviosARetener.hasNext())
            {
                try
                {
                    int indice1 = 0;
                    EnvioNoClassDto envioNoClassDto = (EnvioNoClassDto)iterEnviosARetener.next();
                    statement4.setObject(++indice1, envioNoClassDto.getCodigoBarras());
                    statement4.setObject(++indice1, constantesGenerales.ID_GESTION_RETENCION_ILOCALIZABLE);
                    statement4.setObject(++indice1, new Timestamp((new java.util.Date()).getTime()));
                    statement4.setObject(++indice1, new Timestamp((new java.util.Date()).getTime()));  
                    statement4.setObject(++indice1, new Timestamp((new java.util.Date()).getTime()));
                    statement4.executeUpdate();
                }
                catch(SQLException e)
                {
                    System.out.println("NoClassDAO: retenerEnviosBySitioOriginal: " + e.toString());
                    e.printStackTrace();
                }
            }
            
        }
        catch (SQLException e)
        {
            throw new DAOException("NoClassDAO:retenerEnviosBySitioOriginal: " + e.toString(), e);
        }
        finally
        {
            closeConnection(statement1, rs1);       
            closeConnection(null, statement2);
            //closeConnection(null, statement3);
            closeConnection(con, statement4);          
        }        
    }
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////   Estos metodos son utilizados para la clasificacion detallada         ///////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    public List getCodigosBarrasSinClasificarByOrdenes(List ordenesLst) throws DAOException 
    {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement1 = null;
        
        ResultSet rs1 = null;
        
        int cantidadOrdenes = ordenesLst.size();
        
        try 
        {
            String numeroOrdenes = "";
            for(int i = 0; i < cantidadOrdenes;) 
            {
                numeroOrdenes += (String)ordenesLst.get(i);
                if( ++i < cantidadOrdenes ) 
                {
                    numeroOrdenes += ",";
                }
            }            
                        
            con = getConnectionDB2();            
            statement1 = con.prepareStatement(  "SELECT T.CODIGO_BARRAS, T.SITIO_ORIGINAL,T.RAZON_SOCIAL, T.NOMBRE_NODO, T.RETENER FROM " +
                                                "( " +
                                                    "(SELECT E.CODIGO_BARRAS, E.SITIO_ORIGINAL,PR.RAZON_SOCIAL, NOD.NOMBRE_NODO, 'false' AS RETENER " +
                                                    "FROM " + SCHEMA + ".ENVIO E " +
                                                    "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
						    "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION NOD ON NOD.CODIGO_NODO=E.CODIGO_NODO " +
						    "INNER JOIN " + SCHEMA + ".PROVEEDOR PR ON PR.CODIGO_PROVEEDOR=NOD.CODIGO_PROVEEDOR " +
						    "WHERE E.NUMERO_ORDEN IN (" + numeroOrdenes + ") AND " +
                                                        "(E.CODIGO_DEPARTAMENTO = ? OR E.CODIGO_DEPARTAMENTO IS NULL) AND " +
                                                        "GE.CODIGO_TIPO_GESTION NOT IN (?,?) ) " +
                                                    "UNION " +
                                                    "(SELECT E.CODIGO_BARRAS, E.SITIO_ORIGINAL,PR.RAZON_SOCIAL, NOD.NOMBRE_NODO, 'true' AS RETENER " +
                                                    "FROM " + SCHEMA + ".ENVIO E " +
                                                    "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
						    "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION NOD ON NOD.CODIGO_NODO=E.CODIGO_NODO " +
						    "INNER JOIN " + SCHEMA + ".PROVEEDOR PR ON PR.CODIGO_PROVEEDOR=NOD.CODIGO_PROVEEDOR " +
                                                    "WHERE E.NUMERO_ORDEN IN (" + numeroOrdenes + ") AND " +
                                                        "(E.CODIGO_DEPARTAMENTO = ? OR E.CODIGO_DEPARTAMENTO IS NULL) AND " +
                                                        "GE.CODIGO_TIPO_GESTION IN (?) ) " +                                                    
                                                ") T " +
                                                "ORDER BY T.CODIGO_BARRAS ASC, T.SITIO_ORIGINAL ASC, T.RETENER ASC");
            
            int indice = 0;
            
            statement1.setObject(++indice, CODIGO_DANE_VACIO);
            statement1.setObject(++indice, constantesGenerales.ID_TIPO_GESTION_EN_PROCESO);
            statement1.setObject(++indice, constantesGenerales.ID_TIPO_GESTION_RETENCIONES);
            statement1.setObject(++indice, CODIGO_DANE_VACIO);
            statement1.setObject(++indice, constantesGenerales.ID_TIPO_GESTION_EN_PROCESO);
            rs1 = statement1.executeQuery();
            
            while (rs1.next()) 
            {
                int indice1 = 0;
                ClasificacionDetalladaDto dto = new ClasificacionDetalladaDto();
                dto.setCodigoBarras(rs1.getString(++indice1));
                dto.setSitioOriginal(rs1.getString(++indice1));
		dto.setNombreProveedor(rs1.getString(++indice1));
		dto.setNombreNodo(rs1.getString(++indice1));
                dto.setPuedeReternerse( rs1.getString(++indice1).equals("true") ? true: false);
                
                retornoLst.add(dto);                
            }
        } 
        catch (SQLException e) 
        {
            throw new DAOException("NoClassDAO:getCodigosBarrasSinClasificarByOrdenes: " + e.toString(), e);
        } 
        finally {
            closeConnection(con, statement1, rs1);
        }
        return retornoLst;
    }
    
    public List clasificarCodigosBarras(List enviosNoClass) throws DAOException 
    {
        Connection con = null;
        PreparedStatement statement1 = null;
        PreparedStatement statement2 = null;

	
        List retornoLst = new ArrayList();
	List noClassLst = new ArrayList();
	List codBarrasLst=new ArrayList();
        try
        {
            Timestamp todayTime = new Timestamp( (new Date()).getTime() );
            
            con = getConnectionDB2();
            statement1 = con.prepareStatement("UPDATE " + SCHEMA + ".ENVIO_NOCLAS " +
                                              "SET CODIGO_DEPARTAMENTO = ?, CODIGO_MUNICIPIO = ?, CODIGO_CENTROP = ?, FECHA_MOVIMIENTO = ?, CODIGO_ESTADO=?, CODIGO_RESPONSABLE=? " +
                                              "WHERE CODIGO_BARRAS = ? ");
            
            statement2 = con.prepareStatement("UPDATE " + SCHEMA + ".ENVIO " +
                                              "SET CODIGO_DEPARTAMENTO = ?, CODIGO_MUNICIPIO = ?, CODIGO_CENTROP = ?, CODIGO_NODO = ? " +
                                              "WHERE CODIGO_BARRAS = ? ");
        
	    
		    
            Iterator clasificacionIter = enviosNoClass.iterator();        
            while (clasificacionIter.hasNext()) 
            {
                ClasificacionDetalladaDto clasificacionDetalladaDto = (ClasificacionDetalladaDto)clasificacionIter.next();
                int indice1 = 0;
                statement1.setObject(++indice1,clasificacionDetalladaDto.getCodigoDepartamento());
                statement1.setObject(++indice1,clasificacionDetalladaDto.getCodigoMunicipio());
                statement1.setObject(++indice1,clasificacionDetalladaDto.getCodigoCentroP());
                statement1.setObject(++indice1, todayTime);
		statement1.setObject(++indice1, NO_CLASS_NO_GENERADO);
                statement1.setObject(++indice1,clasificacionDetalladaDto.getCodigoResponsable());
		statement1.setObject(++indice1,clasificacionDetalladaDto.getCodigoBarras());
                
                indice1 = 0;
                statement2.setObject(++indice1,clasificacionDetalladaDto.getCodigoDepartamento());
                statement2.setObject(++indice1,clasificacionDetalladaDto.getCodigoMunicipio());
                statement2.setObject(++indice1,clasificacionDetalladaDto.getCodigoCentroP());
                statement2.setObject(++indice1,clasificacionDetalladaDto.getCodigoNodo());
                statement2.setObject(++indice1,clasificacionDetalladaDto.getCodigoBarras());
                
                statement2.executeUpdate();                    
                statement1.executeUpdate();
                
                clasificacionDetalladaDto.setCorrected(true);
		
                codBarrasLst.add(this.debeGenerarBaseEMXCodbar(clasificacionDetalladaDto.getCodigoBarras()));
		noClassLst.add(clasificacionDetalladaDto);            
            }
	    retornoLst.add(noClassLst);
	    retornoLst.add(codBarrasLst);
        }
        catch (SQLException e)
        {
            throw new DAOException("NoClassDAO:clasificarCodigosBarras: " + e.toString(), e);
        }
        finally
        {
            closeConnection(null, statement1);
            closeConnection(con, statement2);
        }
        return retornoLst;
    }
    
    public void retenerEnviosByCodigoBarras(ClasificacionDetalladaDto clasificacionDetalladaDto) throws DAOException 
    {
        Connection con = null;
        PreparedStatement statement1 = null;
        //PreparedStatement statement2 = null;
        PreparedStatement statement3 = null;
	PreparedStatement statement4 = null;
           Timestamp todayTime = new Timestamp( (new Date()).getTime() );
        try
        {
            con = getConnectionDB2();     
            
            statement1 = con.prepareStatement("UPDATE "+ SCHEMA +".ENVIO SET CODIGO_ULTIMA_GESTION = ?, FECHA_ULTIMA_GESTION = ? " +
                                              "WHERE CODIGO_BARRAS = ? ");
            
            /*statement2 = con.prepareStatement("DELETE FROM "+ SCHEMA +".ENVIO_NOCLAS " +
                                              "WHERE CODIGO_BARRAS = ? ");*/
           
	    
            statement3   = con.prepareStatement("INSERT INTO "+ SCHEMA +".ENVIO_MOVIMIENTO (CODIGO_BARRAS,CODIGO_GESTION,FECHA_MOVIMIENTO,FECHA_WEB,FECHA_CARGA_WEB,CODIGO_RESPONSABLE) VALUES (?,?,?,?,?,'"+ clasificacionDetalladaDto.getCodigoResponsable() +"') ");
            
	    statement4	= con.prepareStatement("UPDATE "+SCHEMA+".ENVIO_NOCLAS SET FECHA_MOVIMIENTO = ?, CODIGO_ESTADO="+NO_CLASS_RETENCION+", CODIGO_RESPONSABLE=? WHERE CODIGO_BARRAS=?");
	    
            int indice = 0;
                        
            statement1.setObject(++indice,constantesGenerales.ID_GESTION_RETENCION_ILOCALIZABLE);
            statement1.setObject(++indice,new java.sql.Date((new java.util.Date()).getTime()));
            statement1.setObject(++indice,clasificacionDetalladaDto.getCodigoBarras());
            statement1.executeUpdate(); 
            
            /*indice = 0;
            statement2.setObject(++indice,clasificacionDetalladaDto.getCodigoBarras());
            statement2.executeUpdate();*/
            
            indice = 0;
            statement3.setObject(++indice, clasificacionDetalladaDto.getCodigoBarras());
            statement3.setObject(++indice, constantesGenerales.ID_GESTION_RETENCION_ILOCALIZABLE);
            statement3.setObject(++indice, new Timestamp((new java.util.Date()).getTime()));
            statement3.setObject(++indice, new Timestamp((new java.util.Date()).getTime()));  
            statement3.setObject(++indice, new Timestamp((new java.util.Date()).getTime()));
            statement3.executeUpdate();   
	    
	    indice = 0;
	    statement4.setObject(++indice,todayTime);
	    statement4.setObject(++indice, clasificacionDetalladaDto.getCodigoResponsable());
            statement4.setObject(++indice, clasificacionDetalladaDto.getCodigoBarras());
	    statement4.executeUpdate();   
	    
        }
        catch (SQLException e)
        {
            throw new DAOException("NoClassDAO:retenerEnviosByCodigoBarras: " + e.toString(), e);
        }
        finally
        {
            closeConnection(null, statement1);
            closeConnection(null, statement4);
            closeConnection(con, statement3);
        }        
    }
    
    /**
     * Retorna los nodos de las empresas de mensajeria que no estan asociadas a esa orden
     */
    public List getNodosEmpresasMensajeriaNoAsociados(OrdenProcesoDto ordenProcesoDto) throws DAOException 
    {
        List retornoLst = new ArrayList();
        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rs = null;
        
        try 
        {
            con = getConnectionDB2();
            statement = con.prepareStatement("SELECT P.CODIGO_PROVEEDOR, P.RAZON_SOCIAL, ND.CODIGO_NODO, ND.NOMBRE_NODO " +
                    "FROM " + SCHEMA + ".NODO_DISTRIBUCION ND " +
                    "INNER JOIN " + SCHEMA + ".PROVEEDOR P ON P.CODIGO_PROVEEDOR = ND.CODIGO_PROVEEDOR " +
                    "WHERE CODIGO_NODO NOT IN ( " +
                                                "SELECT OPD.CODIGO_NODO " +
                                                "FROM " + SCHEMA + ".ORDEN_PROCESO_DETALLE OPD " +
                                                "WHERE OPD.NUMERO_ORDEN = ? " +
                                             ") " +
                    "AND P.CODIGO_TIPO_PROVEEDOR = ? " +
                    "ORDER BY P.RAZON_SOCIAL, ND.NOMBRE_NODO ASC");
            
            int indice=0;
            
            statement.setObject(++indice, ordenProcesoDto.getNumeroOrden());
            statement.setObject(++indice, CODIGO_TIPO_PROVEEDOR_MENSAJERIA);
            rs = statement.executeQuery();
            
            while (rs.next()) 
            {
                int indice1 = 0;
                NodoDistribucionDto dto = new NodoDistribucionDto();
                dto.setCodigoProveedor(rs.getString(++indice1));
                dto.setNombreProveedor(rs.getString(++indice1));
                dto.setCodigoNodo(rs.getString(++indice1));
                dto.setNombreNodo(rs.getString(++indice1));
                retornoLst.add(dto);
            }
        } 
        catch (SQLException e) {
            throw new DAOException("NoClassDAO:getNodosEmpresasMensajeriaNoAsociados: " + e.toString(), e);
        } 
        finally {
            closeConnection(con, statement, rs);
        }
        return retornoLst;
    }
    
    public void asociarOrdenProcesoNodo(OrdenProcesoDto ordenProcesoDto) throws DAOException 
    {
        Connection con = null;
        PreparedStatement statement = null;
        
        try 
        {
            con = getConnectionDB2();
            
            statement = con.prepareStatement("INSERT INTO " + SCHEMA + ".ORDEN_PROCESO_DETALLE (NUMERO_ORDEN,CODIGO_NODO) VALUES (?,?) ");
            
            int indice = 0;
            statement.setObject(++indice, ordenProcesoDto.getNumeroOrden());
            statement.setObject(++indice, ordenProcesoDto.getCodigoNodo());            
            statement.executeUpdate();        
        } 
        catch (SQLException e) 
        {
            throw new DAOException("NoClassDAO:asociarOrdenProcesoNodo: " +e.toString(), e);
        } 
        finally 
        {
            closeConnection(con, statement);
        }        
    }    
}
